<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
</body>
<script>
    // 使用单例模式
    class Evemit{
        constructor(){
            // 创建当前实例的事件队列，
            this.eventList = {}
        }
        // 绑定监听 : 事件的名称和回调函数
        on(type, fn){
            (this.eventList[type] || (this.eventList[type] = [])).push(fn)
        }
        // 触发监听函数 :事件名称
        emit(type){
            let fnList = this.eventList[type] || []
            for(let i = 0; i < fnList.length; i++){
                // 执行绑定的函数
                fnList[i]()
            }
        }
        // 解除绑定 : 事件名称
        Don(type){
            delete this.eventList[type] 
        }
        // 只执行一次 ：事件名称 回调函数
        Once(type, fn){
            // 使用闭包实现
            let is = true
            let that = this
            that.eventList[type] = []
            that.eventList[type].push(function(){
                if(is) fn()
                is = false
                // 删除掉该函数
                that.Don(type)
            })
        }
    }
    let evemit = new Evemit()
    evemit.on('click',function(){
        console.log('click方法触发了')
    })
  /*   evemit.Once('delete',function(){
        console.log('delete监听触发了，只触发一次')
    }) */
    
</script>
</html>